// 重写的数组的哪些方法 7个
// push, pop, unshift, shift, reverse, sort, splice 会导致数组本身发生变化
// slice() 不会改变数组
let oldArrayMethods = Array.prototype;
export let arrayMethods = Object.create(oldArrayMethods);
// 1. value.__proto__ = arrayMethods 原型链查找，的问题， 会向上查找， 先查找我重写的， 重写的没有回继续向上查找
// 2. arrayMethods.__proto__ = oldArrayMethods

const methods = [
  "push",
  "pop",
  "unshift",
  "shift",
  "reverse",
  "sort",
  "splice",
];

methods.forEach(method => {
  arrayMethods[method] = function (...args) {
    console.log("用户调用了" + method + "方法"); // AOP 切片编程
    const result = oldArrayMethods[method].apply(this, args); // 调用原生的数组方法

    // push, unshift 添加的元素可能还是一个对象
    let inserted;
    let ob = this.__ob__;
    switch (method) {
      case "push":
      case "unshift":
        inserted = args;
        break;
      case "splice": // 3个， 新增的属性 splice， 有删除， 新增的功能
        inserted = args.slice(2);
        break;
      default:
        break;
    }

    if (inserted) ob.observerArray(inserted);

    return result;
  }
})